package com.tedu.api.io;

import jdk.internal.util.xml.impl.Input;
import org.junit.Test;

import java.io.*;
import java.text.FieldPosition;

/**
 * 标准流：IO流处理异常对象
 *
 * 高级流：BufferedOutputStream  缓冲输出流  写    bos.txt
 *       BufferedInputStream    缓冲输入流 读
 */
public class IOSAPI {
    /**
     * 缓冲输入流：构造器-->异常对象
     * 字符流[转换流]--解决：缓冲输入流读取单位 为字节问题
     * InputStreamReader 读取单位：字符
     * OutputStreamWrite 写出单位：字符  调用字符串getBytes写出文本
     *
     * 缓冲输入流：具备功能：合理传输数据 效率提高
     * 构造器具备：添加字符集：UTF8万国码
     * new BufferedOutputStream(低级流引用，size:存字节数组【指定】)
     * 问题1：不能指定字符集
     *    2：不能按照字符读取
     */
    @Test
    public void testBIS(){
//        //创建低级流
//        FileInputStream fis=new FileInputStream("bos.txt");
//        //创建高级流--指定字符集--缓冲不具备功能---新【转换流】
//        BufferedOutputStream bos=new BufferedOutputStream(fis);
//        /**
//         * read()------读：一个字节，字节数组------->专门读文字
//         */
//        bos.read();
    }
    /**
     * 针对缓冲输出/输入功能的上限---传输：文本
     * 字符流[转换流]--解决：缓冲输入流读取单位 为字节问题
     *   InputStreamReader 读取单位：字符
     *   OutputStreamWrite 写出单位：字符  调用字符串getBytes写出文本
     *   需求：重新写流--针对：文字 写出文本：osw.txt
     *
     */
@Test
    public void testOSW() throws IOException {
    //标准流：1.置空流
    FileOutputStream fos=null;
    OutputStreamWriter osw=null;
    //标准流：2.捕获异常
    try {
        //创建低级流
        fos=new FileOutputStream("osw.txt");
        //不考虑效率--只传输文本 字符输出流：输出单位字符形式
 osw=new OutputStreamWriter(fos,"UTF8");
        //write() 直接写出文本【不需要将文本转换为字节数组】
        osw.write("给老铁双击~~");
        osw.write("666\n");//换行：字符 char
        osw.write("777");
    } catch (FileNotFoundException e) {  //文件不存在
        e.printStackTrace();
    }catch(UnsupportedEncodingException e){
        e.printStackTrace();
    }catch (IOException e) {  //IO流异常：所有传输失败总异常
        e.printStackTrace();
    }
    finally {
        //关闭高级流：字符输出流
        if (osw!=null);
        try {
            osw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

    /**
     * 高级流【处理流】--转换流，特点：套在低级流上，被其他高级流套上【传输单位：字符】
     *
     * 字符输入流 --- 单元测试：testISR()  读入 文本【不可以读入字符串】
     * 字符输出流 --- 单元测试：testOSW()  写出 文本【字符串】
     * InputStreamReader    字符输入流   不可以读入文本
     *
     * 高级流【处理流】---转换流【字符流】--缓冲字符流：解决读入、写出都是字符形式
     * BufferedReader   缓冲字符输入流--解决：InputStreamReader 读入字节形式
     *                                       BufferedReader 读入字符形式
     * BufferedWriter
     * 需求：ISR字符输入流读取 osw.txt 文件 ？？
     *     当前代码转换为标准流IO：捕获所有异常
     *     读取每行文本？   readLine()  提示:不为null代表文本写出
     *     写出：
     */
    @Test
    public void testISR() throws IOException {
        //创建低级流
        FileInputStream fis=new FileInputStream("osw.txt");
        //创建高级流--转换流--字符输入流
        InputStreamReader isr=new InputStreamReader(fis);
        //读  read()   问题：读入数据单位：字节，而不是字符，读字符
        //                 转换流-----套高级流：缓冲字符输入/出流
        //创建高级流--针对转换流中：字符输入流无法读取形式：
        //                    字符的情况--缓冲字符输入流
        BufferedReader br=new BufferedReader(isr);
        /**BufferedReader 类
         * readLine() 读入若干操作，直到读到没有换行符为止
         *
         */
        String line=null;
        //  判断条件:文本中一直有内容，一直读  一行文本
        while((line=br.readLine())!=null){
            System.out.println("打印读到的字符串："+line);
        }

    }
    /**
     * 作业2：读取IOSAPI.java文件---所有代码--写出控制台
     *
     *
     */
    @Test
    public void testHomeWork2() throws IOException {
        //1.创建低级流---读入--找IOSAPI.java
        FileInputStream fis=new FileInputStream("src\\main\\java\\com\\tedu\\api\\io\\IOSAPI.java");
        //路径：D:\java-api\API\src\main\java\com\tedu\api\io\ISOAPI.java

        //2.创建高级流---读入内容是文本---转换流---无法读取文本
        InputStreamReader isr = new InputStreamReader(fis);
        //3.创建高级流---缓冲输入流---读取文本
        BufferedReader br = new BufferedReader(isr);
        //4.创建变量：字符串类型---保存每次读取的一行文本
        String line=null;   //null代表没有内容【等同于换行】
        //5.一直读入：每行文本保存line中，如果line不为null,一直读
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }

        //6.关闭高级流
        br.close();
    }

    /**
     * 高级流：
     * BufferedWriter---低配版本输出流【缓冲输出流】
     * PrintWriter---高配版本输出流【字符输出流】
     * 1.高级流不能直接---直接创建（不需要创建低级流）--封装
     * 2.封装内存所有流的特点
     * 需求：写出文件 pw.txt---文本内容，需要指定编码集：UTF8
     */
    @Test
    public void testPW() throws FileNotFoundException, UnsupportedEncodingException {
        //低级流：输出流
        FileOutputStream fos=new FileOutputStream("pw.txt");
        //高级流：转换流，功能：指定编码集
        OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF8");
        //高级流：缓冲流，功能：提高效率
        BufferedWriter bw=new BufferedWriter(osw);
        //创建高级流:低级流：输出流+转换流+缓冲流
        PrintWriter pw=new PrintWriter(bw);
        //写出功能：print()   打印一行文本 不换行
        //        println()  打印一行文本 换行
        pw.print("你就是");
        pw.println("我的小可爱");
        pw.close();
    }
}
